/**
 * Software License, Version 1.0
 *
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 *
 *
 *Redistribution and use in source and binary forms, with or without
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For
 * further information contact the Community Grids Lab at
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and
 * wherever such third-party acknowledgments normally appear.
 *
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering,
 * shall not be used to endorse or promote products derived from this software
 * without prior written permission from Indiana University.  For written
 * permission, please contact the Advanced Research and Technology Institute
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering,
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 *
 *
 * Indiana University provides no reassurances that the source code provided
 * does not infringe the patent or any other intellectual property rights of
 * any other entity.  Indiana University disclaims any liability to any
 * recipient for claims brought by any other entity based on infringement of
 * intellectual property rights or otherwise.
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS.
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS",
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION
 *GENERATED USING SOFTWARE.
 */

package cgl.narada.service.tds;

/**
 *
 * @author Hasan Bulut  - hbulut@indiana.edu
 * Community Grids Lab., Indiana University
 * @version 1.0
 */

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import cgl.narada.service.buffering.NBEventComparator;
import cgl.narada.service.qos.QosEvent;

public class TDSBuffer {
  private List buffer = Collections.synchronizedList(new LinkedList());
  private NBEventComparator nbEventCmp = new NBEventComparator();
  private int maxNumberOfEntries = 10;
  private int numberOfEntries = 0;

  public TDSBuffer() {
  }

  public int size() {
    return buffer.size();
  }

  public long getTimestamp() {
    long temp = 0;
    if (buffer.size() != 0) {
      temp = ( (QosEvent) buffer.get(0)).getNBEvent().getEventHeaders().getTimeStamp();
    }
    return temp;
  }

  public long getTimestamp(int i) {
    long temp = 0;
    if (i < buffer.size()) {
      temp = ( (QosEvent) buffer.get(i)).getNBEvent().getEventHeaders().getTimeStamp();
    }
    return temp;
  }

  public synchronized Object remove(int i) {
    if (i < buffer.size()) {
      return buffer.remove(i);
    }
    else {
      return null;
    }
  }

  public synchronized Object removeFirst() {
    if (buffer.size() > 0) {
      return buffer.remove(0);
    }
    else {
      return null;
    }
  }

  public long getLastTimestamp() {
    long tempTS = 0;
    int len = buffer.size();
    if (len > 0) {
      tempTS = ( (QosEvent) buffer.get(len - 1)).getNBEvent().getEventHeaders().
          getTimeStamp();
    }
    return tempTS;
  }

  public void putEvents(List events) {
    int temp = events.size();
    for (int i = 0; i < temp; i++) {
      buffer.add(events.remove(0));
    }
    Collections.sort(buffer, nbEventCmp);
  }

  public synchronized void putEvent(QosEvent qosEvent) {
    long tempTS1 = 0;
    long tempTS2 = 0;
    if (buffer.size() > 0) {
      tempTS1 = qosEvent.getNBEvent().getEventHeaders().getTimeStamp();
      tempTS2 = ( (QosEvent) buffer.get(buffer.size() - 1)).getNBEvent().
          getEventHeaders().getTimeStamp();
      buffer.add(qosEvent);
      if (tempTS1 < tempTS2) {
        Collections.sort(buffer, nbEventCmp);
      }
    }
    else {
      buffer.add(qosEvent);
    }
  }

}
